package com.fjbdxk.beidou.file;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 文件切片工具类
 *
 * @author huanggy
 * @version 1.0.0
 * @date 2024/04/30
 **/
public class FileSlicerUtils {

    /**
     * 执行文件切片动作
     *
     * @param filePath       源文件路径
     * @param sliceSizeBytes 每个切片大小
     * @param outFilePath    切片文件输出位置
     * @return 返回切片数量
     * @throws IOException 涉及读写，会有IO异常的可能，需要使用方自行处理
     */
    public static int slicer(String filePath, int sliceSizeBytes, String outFilePath) throws IOException {
        FileInputStream fis = new FileInputStream(filePath);
        byte[] buffer = new byte[sliceSizeBytes];
        int bytesRead;
        int sliceIndex = 1;
        while ((bytesRead = fis.read(buffer)) != -1) {
            String sliceFileName = String.format("%s%d", outFilePath, sliceIndex++);
            FileOutputStream fos = new FileOutputStream(sliceFileName);
            fos.write(buffer, 0, bytesRead);
        }
        return sliceIndex - 1;

    }

    /**
     * 执行文件合并动作
     *
     * @param slicePrefix    切片文件前缀
     * @param sliceCount     切片数量
     * @param mergedFilePath 合并后文件输出路径
     * @throws FileNotFoundException 涉及读取，会有文件找不到的可能，需要使用方自行处理
     * @throws IOException           涉及读写，会有IO异常的可能，需要使用方自行处理
     */
    public static void merger(String slicePrefix, int sliceCount, String mergedFilePath) throws FileNotFoundException, IOException {
        FileOutputStream fos = new FileOutputStream(mergedFilePath);
        for (int i = 1; i <= sliceCount; i++) {
            String sliceFileName = String.format("%s%d", slicePrefix, i);
            FileInputStream fis = new FileInputStream(sliceFileName);
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);
            }
        }
    }

}
